﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 里氏转换原则
{
    class Program
    {
        static void Main(string[] args)
        {
            // 一句话解释里氏转换原则：子类对象给父类变量赋值（父类的引用可以指向子类的对象）
            Animal animal = new Cat(); // 真实类型是Cat，但是我们用动物的容器去把它包装
            Console.WriteLine(animal);
            // 容易出现问题，出现问题的概率会大大增加
            Animal ani = new Animal();
            //Cat ca = (Cat)ani;
            Cat ca = ani as Cat;
            Console.WriteLine(ca);

            //Cat cat = (Cat)animal;
            // 如果使用括号进行强制转换的话，转换失败会出现异常（运行时的错误），而使用as运算符转换失败不会出异常，会返回null
            //Cat cat = animal as Cat;

            // is 用来判断某个对象是否是指定的类。如果是返回true，否则返回false
            if (ani is Cat)
            {
                Console.WriteLine("ani是Animal");
            }
        }
    }

    class Animal
    {

    }

    class Cat : Animal
    {

    }
}
